package com.sap.sap_mangers.service;


import com.sap.sap_mangers.Vo.JoinVo.JoinManagerVo;
import com.sap.sap_mangers.Vo.UserVo.SapUserSessionList;
import com.sap.sap_mangers.Vo.UserVo.UserMessage;
import com.sap.sap_mangers.dto.user.NoticeDto;
import com.sap.sap_mangers.dto.user.RegisterUser;
import com.sap.sap_mangers.dto.user.SoftAssociationChange;
import com.sap.sap_mangers.pojo.*;
import com.sap.sap_mangers.until.SimpleJson;
import org.apache.ibatis.annotations.Param;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * @author 阿东
 * @date 2022/6/30 [23:55]
 */
public interface UserService {
    /**
     * 通过学号查找用户信息
     *
     * @param username 学号
     * @return 用户信息
     */
    User getUserByUserName(String username);

    /**
     * 获取软件协会每一届的所有成员信息及其身份
     *
     * @param session 某一届
     * @return 成员信息及其身份
     */
    List<SapUserSessionList> getUserSessionList(Integer session);

    /**
     * 获取用户个人信息
     *
     * @return 个人信息
     */
    UserMessage getUserMessage(String username);

    /**
     * 注册用户
     *
     * @param registerUser 注册用户的信息
     * @return 是否成功注册
     */
    SimpleJson registerUser(RegisterUser registerUser);

    /**
     * 修改用户的具体信息：网名，个性签名，性别，电话号码
     *
     * @param detailsUser 用户的信息
     * @return 修改情况
     */
    SimpleJson updateUserDefinition(DetailsUser detailsUser);


    /**
     * 验证用户名和qq的正确性--> 成功则可进行密码的修改
     *
     * @return 第一个元素验证成功返回true，否则返回false；第二个元素没有绑定返回true，已经绑定qq返回false
     */
    SimpleJson identityUsernameAndQq(User user);

    /**
     * @param user
     * @return
     */
    SimpleJson generateCode(User user);

    /**
     * 增加QQ号
     *
     * @param qq qq
     * @return 视图
     */
    SimpleJson addQq(String qq, String username);


    /**
     * 获取用户个人头像
     *
     * @param username 学号
     * @return 头像的地址
     */
    SimpleJson getUserHeadShot(@Param("username") String username);

    /**
     * 更新头像
     *
     * @param multipartFile 文件流
     */
    SimpleJson updateHeadShot(MultipartFile multipartFile);

    /**
     * 通过学号获取通知
     *
     * @return 视图
     */
    SimpleJson getNoticeByUsername();

    /**
     * h获取所有的通知消息
     *
     * @return 视图
     */
    SimpleJson getNoticeMessage();

    /**
     * 确认通知消息
     *
     * @param noticeId 消息ID
     * @return 视图
     */
    SimpleJson confirmationMessage(String noticeId);

    /**
     * 生成通知消息
     *
     * @param noticeDto 消息
     * @return 视图
     */
    SimpleJson sendNotice(NoticeDto noticeDto);

    /**
     * 获得 会长 的信息
     *
     * @return 会长信息
     */
    User getPresidentUserInfo();

    /**
     * 定时器 发送通知
     *
     * @param noticeDto 消息通知内容
     */
    void sendNoticeAuto(NoticeDto noticeDto);

    /**
     * 换届接口service
     *
     * @param softAssociationChange 换届信息
     * @return 视图
     */
    SimpleJson softAssociationChange(SoftAssociationChange softAssociationChange);

    /**
     * 修改权限(角色)，身份，历史身份
     * @param username 学号
     * @param role role
     * @param rank 等级(1-12)
     * @return 视图
     */
    SimpleJson updateRolePosts(String username,Integer role,Integer rank);

    /**
     * 获取部长的相关信息
     *
     * @return 部长的用户信息
     */
    List<Minister> getMinister();

    /**
     * 获取普通成员信息
     *
     * @return 普通成员信息
     */
    List<Minister> getOrdinaryMembers();

    /**
     * 通过学号获取ip登录
     *
     * @param username 学号
     * @return ip记录
     */
    List<SapIp> getIpByUsername(String username);

    /**
     * 获取所有用户登录信息
     *
     * @return 登录信息
     */
    List<SapIp> getIp();

    /**
     * 添加ip记录(登录的时候添加)
     *
     * @param ip ip
     */
    void addIp(@Param("ip") SapIp ip);

    /**
     * 获取软协的人数信息：男生总人数，女生总人数，未知人数，以及历年人数信息
     *
     * @return 信息
     */
    SimpleJson getSapPeopleNumberInfo();

    /**
     * 获取当前会长学号
     *
     * @return 会长学号
     */
    String getPresidentUsername();

    /**
     * [新生入会]
     * 填充入会管理员表
     * <p>
     * 除了在整合的换届接口中，要先判断调用人是否为会长，只允许会长使用;
     * 清空表，获取所有管理层学号，添加到表中;
     * 方法同步，保持一致，事务支持
     */
    void fillJoinManagerTable();

    /**
     * [新生入会]
     * 设置或撤销正式入会管理员职责
     * <p>
     * 只允许会长使用,
     * 更改是否负责字段的值,
     * 同步处理
     *
     * @param username 管理员学号
     * @return Json
     */
    SimpleJson changeJoinManagerResponsible(String username);

    /**
     * [新生入会]
     * (负责人)设置收款码
     * <p>
     * 图片验证后上传cos,
     * 数据库update收款码cos地址,
     * 事务支持
     *
     * @param collectionCode 收款码图片
     * @param type           收款码种类 (0:微信；1:支付宝)
     * @return Json
     */
    SimpleJson setCollectionCode(MultipartFile collectionCode, Integer type);

    /**
     * [新生入会]
     * (负责人)清空收款码
     * <p>
     * 通过token获取学号，根据参数确定收款码类型;
     * 删除cos图片，数据库收款码字段设为null;
     * 事务支持
     *
     * @param type 收款码种类 (0:微信；1:支付宝)
     * @return Json
     */
    SimpleJson deleteCollectionCode(Integer type);

    /**
     * [新生入会]
     * 点击入会申请(升级会员)按钮
     * <p>
     * 未点击过 -> 匹配管理员，返回管理员QQ、收款码;
     * 点击过未提交(提交要上传付款的转账单号) -> 直接返回管理员QQ、收款码(先判断原负责人当前是否仍有效(收款码/是否负责)，没效就先重新匹配);
     * 提交但未审核 -> 直接返回QQ、邀请码、填写的转账单号;
     * 已入会 -> 无;
     *
     * @return Json
     */
    SimpleJson clickJoinButton();

    /**
     * [新生入会]
     * 工具方法 - 挑选一个合适的负责人
     * <p>
     * 从负责管理且上传了至少一种收款码的管理员中挑选一个
     * 提供给clickJoinButton()方法使用
     * 方法同步
     *
     * @return 挑选的负责人
     */
    SapJoinManager choiceManager();

    /**
     * [新生入会]
     * 提交申请 (提交转账单号)
     *
     * 限定参数长度10-50
     *
     * @param paymentTransferNumber 转账单号
     * @return Json
     */
    SimpleJson submitApplication(String paymentTransferNumber);

    /**
     * [新生入会]
     * 审核
     *
     * @param paymentTransferNumber 收款单号
     * @param invitationCode        邀请码
     * @return Json
     * @throws Exception 异常
     */
    SimpleJson toExamine(String paymentTransferNumber, String invitationCode) throws Exception;

    /**
     * [新生入会]
     * 检测过期的记录，将join_lapse字段改为1
     * <p>
     * 入会申请记录的create_time字段在每次点击申请按钮时都会刷新，填写过转账单号的记录不会过期
     * 检测create_time字段到当前时间大于24h的未填写单号的未过期记录，将其对应join_lapse字段改为1标识已过期
     */
    void detectExpiredJoinApplicationRecords();

    /**
     * [新生入会]
     * 获取当前是否开启入会升级接口(入会申请相关接口)
     *
     * @return 当前是否开启入会升级接口
     */
    boolean getSapIfOpenJoinFunction();

    /**
     * [新生入会]
     * 开启/关闭 入会升级接口(入会申请相关接口)
     *
     * @return Json
     */
    SimpleJson updateSapIfOpenJoinFunction();

    /**
     * [新生入会]
     * 查询所有管理员的信息视图
     *
     * @return 管理员信息视图
     */
    List<JoinManagerVo> getJoinManagerVos();

    /**
     * [新生入会]
     * 通过邀请码获取对应申请记录信息
     *
     * @param invitationCode 邀请码
     * @return 申请记录
     */
    SapJoinApplication getJoinApplicationByCode(String invitationCode);

    /**
     * [新生入会]
     * 通过学号获取入会管理员表信息 (用于判断是否为入会管理员)
     *
     * @param username 学号
     * @return 入会管理员表信息
     */
    SapJoinManager getSapJoinManager(String username);

    /**
     * [新生入会]
     * 查询异常的申请记录 (填写了单号但未成功处理) -> 填写了转账单号的记录不会过期，系统审核通过才算处理成功
     *
     * @return 填写了单号但未成功处理的申请记录 (不排除单号是乱填的的可能)
     */
    List<SapJoinApplication> getAbnormalJoinApplication();

    /**
     * [新生入会]
     * 清空填写的转账单号
     *
     * @param username 申请人学号
     * @return Json
     */
    SimpleJson clearJoinApplicationPaymentTransferNumber(String username);

    /**
     * 通过学号获取真名
     *
     * @param username 学号
     * @return 真名
     */
    String getRealName(String username);

    /**
     * 添加某个时间段在线人员信息
     *
     * @param sapOnlinePeople 在线人员信息
     */
    void addOnlinePeople(SapOnlinePeople sapOnlinePeople);



    SimpleJson  getOnlinePeopleMessageCopy();

    /**
     * 提交问题或建议
     *
     * @param sapAdviceOrQuestion 内容信息
     */
    void addAdviceOrQuestion(SapAdviceOrQuestion sapAdviceOrQuestion);

    /**
     * 发送问题或建议给会长
     *
     * @param sapAdviceOrQuestion 内容信息
     * @return 发送状况
     */
    SimpleJson sendAdviceOrQuestionOfNotice(SapAdviceOrQuestion sapAdviceOrQuestion);

    /**
     * 获取都存在那几届软协成员
     * @return 年份
     */
    List<Integer> getSessionYear();

    /**
     * [新生入会]
     * 根据管理员获取其负责的、提交了单号的入会记录
     *
     * @return 管理员负责的、提交了单号的入会记录 (根据是否被审核分类) (无数据时返回null)
     */
    Map<String,List<SapJoinApplication>> getSubmittedJoinApplicationByManager();

    /**
     * [新生入会]
     * 直接升级会员 (事务支持)
     *
     * @param username 学号
     * @param accounting 是否需要添加账单(传no或者yes)(没支付传no)
     * @return 处理结果
     * @Exception 财务表异常
     */
    SimpleJson directUpgrade(String username, String accounting) throws Exception;
}
